From 60051ff6700171c384257134952110a3db0643e9 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Mon, 23 Apr 2001 23:03:53 +0000 Subject: [PATCH] add missing '}' that got munched by #endif. Mon Apr 23 18:57:03 2001 Jonathan Blandford * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that got munched by #endif. * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' * gtk/gtktreeview.c: Refactored code to clean up a number of events. * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return values to make consistent with other functions. Spotted by Jeff Franks . * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal declaration spotted by Jeff Franks . --- ChangeLog | 17 ++ ChangeLog.pre-2-0 | 17 ++ ChangeLog.pre-2-10 | 17 ++ ChangeLog.pre-2-2 | 17 ++ ChangeLog.pre-2-4 | 17 ++ ChangeLog.pre-2-6 | 17 ++ ChangeLog.pre-2-8 | 17 ++ docs/reference/gtk/tmpl/gtk-unused.sgml | 48 ++++ docs/reference/gtk/tmpl/gtkcolorsel.sgml | 66 +---- docs/reference/gtk/tmpl/gtkrc.sgml | 1 - gtk/Makefile.am | 2 +- gtk/gtksocket.c | 3 +- gtk/gtktreedatalist.c | 1 + gtk/gtktreemodel.c | 8 +- gtk/gtktreeprivate.h | 20 +- gtk/gtktreeselection.c | 4 +- gtk/gtktreeview.c | 350 ++++++++++++++++++----- gtk/gtktreeview.h | 26 +- 18 files changed, 498 insertions(+), 150 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5a41060c88..0b32b0f69a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,20 @@ +Mon Apr 23 18:57:03 2001 Jonathan Blandford + + * gtk/gtksocket.c (gtk_socket_filter_func): add missing '}' that + got munched by #endif. + + * gtk/Makefile.am (gtk_plug_c_sources): add missing '\' + + * gtk/gtktreeview.c: Refactored code to clean up a number of + events. + + * gtk/gtktreemodel.c (gtk_tree_path_compare): Switched return + values to make consistent with other functions. Spotted by Jeff + Franks . + + * gtk/gtktreeview.h (struct _GtkTreeViewClass): Fixes to signal + declaration spotted by Jeff Franks . + 2001-04-23 Sven Neumann * gtk/Makefile.am diff --git a/docs/reference/gtk/tmpl/gtk-unused.sgml b/docs/reference/gtk/tmpl/gtk-unused.sgml index c3ee353dcb..20397f167d 100644 --- a/docs/reference/gtk/tmpl/gtk-unused.sgml +++ b/docs/reference/gtk/tmpl/gtk-unused.sgml @@ -839,6 +839,38 @@ normally be used to create a #GtkCList widget. Use gtk_clist_new() instead. of the columns. There should be enough strings in the array for the number of columns specified. + + + + + +@colorsel: +@color: + + + + + + +@colorsel: +@Returns: + + + + + + +@colorsel: +@Returns: + + + + + + +@colorsel: +@color: + Controls whether opacity can be set with the #GtkColorSelection. @@ -852,6 +884,22 @@ the gtk_color_selection_get_color() function. @use_opacity: a boolean indicating whether the opacity selection is enabled. + + + + + +@colorsel: +@use_opacity: + + + + + + +@colorsel: +@use_palette: + This function is not usually used by users. diff --git a/docs/reference/gtk/tmpl/gtkcolorsel.sgml b/docs/reference/gtk/tmpl/gtkcolorsel.sgml index d762940aeb..b5dcb93cd3 100644 --- a/docs/reference/gtk/tmpl/gtkcolorsel.sgml +++ b/docs/reference/gtk/tmpl/gtkcolorsel.sgml @@ -64,42 +64,6 @@ time. @policy: a #GtkUpdateType value indicating the desired policy. - - - - - -@colorsel: -@use_opacity: - - - - - - - -@colorsel: -@Returns: - - - - - - - -@colorsel: -@use_palette: - - - - - - - -@colorsel: -@Returns: - - Sets the color in the #GtkColorSelection. The widgets are updated @@ -121,33 +85,17 @@ Retrieve the currently selected color value. blue, and opacity. - - - - - -@colorsel: -@color: - - - - - - - -@colorsel: -@color: - - @colorsel: +@index: +@color: + @x: @y: -@color: @@ -156,10 +104,12 @@ blue, and opacity. @colorsel: -@x: -@y: +@index: @color: @Returns: + +@x: +@y: @@ -168,6 +118,8 @@ blue, and opacity. @colorsel: +@index: + @x: @y: diff --git a/docs/reference/gtk/tmpl/gtkrc.sgml b/docs/reference/gtk/tmpl/gtkrc.sgml index 4c81682d17..178b403922 100644 --- a/docs/reference/gtk/tmpl/gtkrc.sgml +++ b/docs/reference/gtk/tmpl/gtkrc.sgml @@ -496,7 +496,6 @@ This can later be composited together with other #GtkRcStyle structures to form a #GtkStyle. -@parent_instance: @name: @bg_pixmap_name: @font_desc: diff --git a/gtk/Makefile.am b/gtk/Makefile.am index 0154bafd4d..8e15fb52d0 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -363,7 +363,7 @@ gtk_c_sources = @STRIP_BEGIN@ \ if USE_X11 gtk_plug_c_sources = @STRIP_BEGIN@ \ gtkplug.c \ - gtksocket.c + gtksocket.c \ @STRIP_END@ endif diff --git a/gtk/gtksocket.c b/gtk/gtksocket.c index 315e84754f..42eb0e67ad 100644 --- a/gtk/gtksocket.c +++ b/gtk/gtksocket.c @@ -1086,7 +1086,8 @@ gtk_socket_filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) GDK_WINDOW_XWINDOW (toplevel->window), RevertToParent, CurrentTime); /* FIXME? */ } -#endif } +#endif + } return_val = GDK_FILTER_REMOVE; break; case FocusOut: diff --git a/gtk/gtktreedatalist.c b/gtk/gtktreedatalist.c index b4f400fb42..5a429ad98b 100644 --- a/gtk/gtktreedatalist.c +++ b/gtk/gtktreedatalist.c @@ -103,6 +103,7 @@ _gtk_tree_data_list_check_type (GType type) return FALSE; } + void _gtk_tree_data_list_node_to_value (GtkTreeDataList *list, GType type, diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index 982639b303..c79e1fe90d 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -350,8 +350,8 @@ gtk_tree_path_copy (GtkTreePath *path) * @a: A #GtkTreePath. * @b: A #GtkTreePath to compare with. * - * Compares two paths. If @a appears before @b in a tree, then 1, is returned. - * If @b appears before @a, then -1 is returned. If the two nodes are equal, + * Compares two paths. If @a appears before @b in a tree, then -1, is returned. + * If @b appears before @a, then 1 is returned. If the two nodes are equal, * then 0 is returned. * * Return value: The relative positions of @a and @b @@ -371,12 +371,12 @@ gtk_tree_path_compare (const GtkTreePath *a, { if (a->indices[p] == b->indices[q]) continue; - return (a->indices[p] < b->indices[q]?1:-1); + return (a->indices[p] < b->indices[q]?-1:1); } while (++p < a->depth && ++q < b->depth); if (a->depth == b->depth) return 0; - return (a->depth < b->depth?1:-1); + return (a->depth < b->depth?-1:1); } /** diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h index 1d6076a93f..0079ff3235 100644 --- a/gtk/gtktreeprivate.h +++ b/gtk/gtktreeprivate.h @@ -46,6 +46,7 @@ extern "C" { #define TREE_VIEW_VERTICAL_SEPARATOR 2 #define TREE_VIEW_HORIZONTAL_SEPARATOR 0 + #define TREE_VIEW_DRAG_WIDTH 6 typedef enum @@ -56,7 +57,8 @@ typedef enum GTK_TREE_VIEW_ARROW_PRELIT = 1 << 3, GTK_TREE_VIEW_HEADERS_VISIBLE = 1 << 4, GTK_TREE_VIEW_DRAW_KEYFOCUS = 1 << 5, - GTK_TREE_VIEW_MODEL_SETUP = 1 << 6 + GTK_TREE_VIEW_MODEL_SETUP = 1 << 6, + GTK_TREE_VIEW_IN_COLUMN_DRAG = 1 << 7, } GtkTreeViewFlags; #define GTK_TREE_VIEW_SET_FLAG(tree_view, flag) G_STMT_START{ (tree_view->priv->flags|=flag); }G_STMT_END @@ -66,6 +68,20 @@ typedef enum #define TREE_VIEW_COLUMN_WIDTH(column) (CLAMP (column->width, (column->min_width!=-1)?column->min_width:column->width, (column->max_width!=-1)?column->max_width:column->width)) #define TREE_VIEW_DRAW_EXPANDERS(tree_view) (!GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IS_LIST)&>K_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS)) + /* This lovely little value is used to determine how far away from the title bar + * you can move the mouse and still have a column drag work. + */ +#define TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER(tree_view) (10*TREE_VIEW_HEADER_HEIGHT(tree_view)) + +typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder; +struct _GtkTreeViewColumnReorder +{ + gint left_align; + gint right_align; + GtkTreeViewColumn *left_column; + GtkTreeViewColumn *right_column; +}; + struct _GtkTreeViewPrivate { GtkTreeModel *model; @@ -118,8 +134,10 @@ struct _GtkTreeViewPrivate gint n_columns; GList *columns; gint header_height; + GtkTreeViewColumnDropFunc *column_drop_func; GList *column_drag_info; + GtkTreeViewColumnReorder *cur_reorder; /* Scroll timeout (e.g. during dnd) */ guint scroll_timeout; diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c index 4c511bb58b..e868ac7041 100644 --- a/gtk/gtktreeselection.c +++ b/gtk/gtktreeselection.c @@ -764,7 +764,7 @@ gtk_tree_selection_real_select_range (GtkTreeSelection *selection, switch (gtk_tree_path_compare (start_path, end_path)) { - case -1: + case 1: _gtk_tree_view_find_node (selection->tree_view, end_path, &start_tree, @@ -782,7 +782,7 @@ gtk_tree_selection_real_select_range (GtkTreeSelection *selection, end_tree = start_tree; end_node = start_node; break; - case 1: + case -1: _gtk_tree_view_find_node (selection->tree_view, start_path, &start_tree, diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 719fae4660..99e2c09682 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -70,15 +70,6 @@ struct _GtkTreeViewChild }; -typedef struct _GtkTreeViewColumnReorder GtkTreeViewColumnReorder; -struct _GtkTreeViewColumnReorder -{ - gint left_align; - gint right_align; - GtkTreeViewColumn *left_column; - GtkTreeViewColumn *right_column; -}; - enum { ROW_ACTIVATED, @@ -268,6 +259,7 @@ static gboolean gtk_tree_view_maybe_begin_dragging_row (GtkTreeView *tree_v GdkEventMotion *event); static void _gtk_tree_view_update_col_width (GtkTreeView *tree_view); +static void gtk_tree_view_column_reorder_remove_draw (GtkTreeViewColumnReorder *reorder); static GtkContainerClass *parent_class = NULL; static guint tree_view_signals[LAST_SIGNAL] = { 0 }; @@ -1649,7 +1641,7 @@ gtk_tree_view_column_button_expose (GtkWidget *button, button->allocation.width - 2, button->allocation.height); gdk_draw_line (button->window, - button->style->white_gc, + button->style->bg_gc[GTK_STATE_SELECTED], button->allocation.width - 1, 0, button->allocation.width - 1, button->allocation.height); @@ -1664,7 +1656,7 @@ gtk_tree_view_column_button_expose (GtkWidget *button, 1, 0, 1, button->allocation.height); gdk_draw_line (button->window, - button->style->white_gc, + button->style->bg_gc[GTK_STATE_SELECTED], 0, 0, 0, button->allocation.height); } @@ -1672,58 +1664,83 @@ gtk_tree_view_column_button_expose (GtkWidget *button, return FALSE; } +/* Motion Event */ static gboolean -gtk_tree_view_motion (GtkWidget *widget, - GdkEventMotion *event) +gtk_tree_view_motion_resize_column (GtkWidget *widget, + GdkEventMotion *event) { - GtkTreeView *tree_view; - GtkRBTree *tree; - GtkRBNode *node; - gint new_y; - GtkRBTree *old_prelight_tree; - GtkRBNode *old_prelight_node; + gint x; + gint new_width; - tree_view = (GtkTreeView *) widget; + if (event->is_hint || event->window != widget->window) + gtk_widget_get_pointer (widget, &x, NULL); + else + x = event->x; - if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE)) - { - gint x; - gint new_width; + new_width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget), + GTK_TREE_VIEW (widget)->priv->drag_pos, &x); + if (x != GTK_TREE_VIEW (widget)->priv->x_drag) + gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), GTK_TREE_VIEW (widget)->priv->drag_pos), new_width); - if (event->is_hint || event->window != widget->window) - gtk_widget_get_pointer (widget, &x, NULL); - else - x = event->x; + /* FIXME: Do we need to scroll */ + _gtk_tree_view_update_size (GTK_TREE_VIEW (widget)); + return FALSE; +} - new_width = gtk_tree_view_new_column_width (GTK_TREE_VIEW (widget), tree_view->priv->drag_pos, &x); - if (x != tree_view->priv->x_drag) - { - gtk_tree_view_column_set_width (gtk_tree_view_get_column (GTK_TREE_VIEW (widget), tree_view->priv->drag_pos), new_width); - } +static gboolean +gtk_tree_view_motion_drag_column (GtkWidget *widget, + GdkEventMotion *event) +{ + GtkTreeView *tree_view = (GtkTreeView *) widget; + GtkTreeViewColumn *column = tree_view->priv->drag_column; + GtkTreeViewColumnReorder *reorder = NULL; + GList *list; + gint x, y; - /* FIXME: Do we need to scroll */ - _gtk_tree_view_update_size (GTK_TREE_VIEW (widget)); - return FALSE; - } + if (column == NULL) + return FALSE; - if (event->window == tree_view->priv->drag_window) - { - GtkTreeViewColumn *column = tree_view->priv->drag_column; - gint x, y; + if (event->window != tree_view->priv->drag_window) + return FALSE; - if (column == NULL) - return FALSE; - gdk_window_get_position (tree_view->priv->drag_window, &x, &y); - x = CLAMP (x + (gint)event->x - column->drag_x, 0, - MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->button->allocation.width); + gdk_window_get_position (tree_view->priv->drag_window, &x, &y); + x = CLAMP (x + (gint)event->x - column->drag_x, 0, + MAX (tree_view->priv->width, GTK_WIDGET (tree_view)->allocation.width) - column->button->allocation.width); - gdk_window_move (tree_view->priv->drag_window, x, y); - return TRUE; - } + gdk_window_move (tree_view->priv->drag_window, x, y); - /* Sanity check it */ - if (event->window != tree_view->priv->bin_window) - return FALSE; + gdk_window_get_position (tree_view->priv->drag_window, &x, NULL); + x += (gint)event->x; + for (list = tree_view->priv->column_drag_info; list; list = list->next) + { + reorder = (GtkTreeViewColumnReorder *) list->data; + if (x >= reorder->left_align && x < reorder->right_align) + break; + reorder = NULL; + } + + if (reorder && reorder == tree_view->priv->cur_reorder) + return TRUE; + + gtk_tree_view_column_reorder_remove_draw (reorder); + + tree_view->priv->cur_reorder = reorder; + + return TRUE; +} + +static gboolean +gtk_tree_view_motion_bin_window (GtkWidget *widget, + GdkEventMotion *event) +{ + GtkTreeView *tree_view; + GtkRBTree *tree; + GtkRBNode *node; + gint new_y; + GtkRBTree *old_prelight_tree; + GtkRBNode *old_prelight_node; + + tree_view = (GtkTreeView *) widget; if (tree_view->priv->tree == NULL) return FALSE; @@ -1771,6 +1788,27 @@ gtk_tree_view_motion (GtkWidget *widget, return TRUE; } +static gboolean +gtk_tree_view_motion (GtkWidget *widget, + GdkEventMotion *event) +{ + GtkTreeView *tree_view; + + tree_view = (GtkTreeView *) widget; + + if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_RESIZE)) + return gtk_tree_view_motion_resize_column (widget, event); + + /* Drag column */ + if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG)) + gtk_tree_view_motion_drag_column (widget, event); + + /* Sanity check it */ + if (event->window == tree_view->priv->bin_window) + return gtk_tree_view_motion_bin_window (widget, event); + return FALSE; +} + /* FIXME Is this function necessary? Can I get an enter_notify event * w/o either an expose event or a mouse motion event? */ @@ -2064,6 +2102,10 @@ gtk_tree_view_button_release (GtkWidget *widget, gtk_widget_queue_resize (GTK_WIDGET (tree_view)); gdk_window_hide (tree_view->priv->drag_window); + g_list_foreach (tree_view->priv->column_drag_info, (GFunc) g_free, NULL); + g_list_free (tree_view->priv->column_drag_info); + tree_view->priv->column_drag_info = NULL; + return TRUE; } @@ -2827,6 +2869,14 @@ gtk_tree_view_forall (GtkContainer *container, } } +/** + * gtk_tree_view_row_activated: + * @tree_view: A #GtkTreeView + * @path: The #GtkTreePath to be activated. + * @column: The #GtkTreeViewColumn to be activated. + * + * Activates the cell determined by @path and @column. + **/ void gtk_tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path, @@ -2834,14 +2884,23 @@ gtk_tree_view_row_activated (GtkTreeView *tree_view, { g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); + /* FIXME: Actually activate the path internally, not just emit the signal */ g_signal_emit (G_OBJECT(tree_view), tree_view_signals[ROW_ACTIVATED], 0, path, column); } +/** + * gtk_tree_view_map_expanded_rows: + * @tree_view: A #GtkTreeView + * @func: A function to be called + * @data: User data to be passed to the function. + * + * Calls @func on all expanded rows. + **/ void -gtk_tree_view_map_open_rows (GtkTreeView *tree_view, - GtkTreeViewMappingFunc func, - gpointer data) +gtk_tree_view_map_expanded_rows (GtkTreeView *tree_view, + GtkTreeViewMappingFunc func, + gpointer data) { g_return_if_fail (GTK_IS_TREE_VIEW (tree_view)); g_return_if_fail (func != NULL); @@ -3672,36 +3731,113 @@ gtk_tree_view_unref_tree (GtkTreeView *tree_view, gtk_tree_path_free (path); } -void -_gtk_tree_view_column_start_drag (GtkTreeView *tree_view, - GtkTreeViewColumn *column) +static void +gtk_tree_view_set_column_drag_info (GtkTreeView *tree_view, + GtkTreeViewColumn *column) { - GdkEvent send_event; - GList *list = NULL; - GList *tmp_list; - gint left, right; GtkTreeViewColumn *left_column; - GtkTreeViewColumn *right_column; + GtkTreeViewColumn *cur_column; + GtkTreeViewColumnReorder *reorder; + + GList *tmp_list; + gint left; /* We want to precalculate the motion list such that we know what column slots * are available. */ - left = 0; left_column = NULL; - for (tmp_list = tree_view->priv->columns; tmp_list; tmp_list = tmp_list->next) + /* First, identify all possible drop spots */ + tmp_list = tree_view->priv->columns; + + while (GTK_TREE_VIEW_COLUMN (tmp_list->data) != column) + { + g_assert (tmp_list); + + cur_column = GTK_TREE_VIEW_COLUMN (tmp_list->data); + tmp_list = tmp_list->next; + + if (cur_column->visible == FALSE) + continue; + + reorder = g_new (GtkTreeViewColumnReorder, 1); + reorder->left_column = left_column; + left_column = reorder->right_column = cur_column; + + tree_view->priv->column_drag_info = g_list_append (tree_view->priv->column_drag_info, reorder); + } + + tmp_list = tmp_list->next; + + /* Find the next visible column */ + while (tmp_list != NULL && ! GTK_TREE_VIEW_COLUMN (tmp_list->data)->visible) + tmp_list = tmp_list->next; + + if (tmp_list == NULL) + goto done; + + left_column = GTK_TREE_VIEW_COLUMN (tmp_list->data); + tmp_list = tmp_list->next; + + while (tmp_list) { - GtkTreeViewColumnReorder *reorder; + cur_column = GTK_TREE_VIEW_COLUMN (tmp_list->data); + tmp_list = tmp_list->next; - if (GTK_TREE_VIEW_COLUMN (tmp_list->data)->visible == FALSE) + if (cur_column->visible == FALSE) continue; - right_column = tmp_list->data; reorder = g_new (GtkTreeViewColumnReorder, 1); + reorder->left_column = left_column; + left_column = reorder->right_column = cur_column; + + tree_view->priv->column_drag_info = g_list_append (tree_view->priv->column_drag_info, reorder); + } + + /* Add the last one */ + reorder = g_new (GtkTreeViewColumnReorder, 1); + reorder->left_column = left_column; + reorder->right_column = NULL; + tree_view->priv->column_drag_info = g_list_append (tree_view->priv->column_drag_info, reorder); + + done: + /* Now we want to fill in the ranges for the columns, now that we've isolated them */ + left = - TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER (tree_view); + + for (tmp_list = tree_view->priv->column_drag_info; tmp_list; tmp_list = tmp_list->next) + { + reorder = (GtkTreeViewColumnReorder *) tmp_list->data; + reorder->left_align = left; + if (tmp_list->next != NULL) + { + g_assert (tmp_list->next->data); + left = reorder->right_align = (reorder->right_column->button->allocation.x + + reorder->right_column->button->allocation.width + + ((GtkTreeViewColumnReorder *)tmp_list->next->data)->left_column->button->allocation.x)/2; + } + else + { + gint width; + + gdk_window_get_size (tree_view->priv->header_window, &width, NULL); + reorder->right_align = width + TREE_VIEW_COLUMN_DRAG_DEAD_MULTIPLIER (tree_view); + } } - /* if (list == NULL) - return;*/ +} + +void +_gtk_tree_view_column_start_drag (GtkTreeView *tree_view, + GtkTreeViewColumn *column) +{ + GdkEvent send_event; + + g_return_if_fail (tree_view->priv->column_drag_info == NULL); + + gtk_tree_view_set_column_drag_info (tree_view, column); + + if (tree_view->priv->column_drag_info == NULL) + return; if (tree_view->priv->drag_window == NULL) { @@ -3765,6 +3901,7 @@ _gtk_tree_view_column_start_drag (GtkTreeView *tree_view, while (gtk_events_pending ()) gtk_main_iteration (); + GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_IN_COLUMN_DRAG); gdk_pointer_grab (tree_view->priv->drag_window, FALSE, GDK_POINTER_MOTION_MASK|GDK_BUTTON_RELEASE_MASK, @@ -4707,6 +4844,15 @@ gtk_tree_view_set_expander_column (GtkTreeView *tree_view, } } +/** + * gtk_tree_view_get_expander_column: + * @tree_view: + * + * Returns the offset of the column that is the current expander column. This + * column has the expander arrow drawn next to it. + * + * Return value: The offset of the expander column. + **/ gint gtk_tree_view_get_expander_column (GtkTreeView *tree_view) { @@ -6702,3 +6848,67 @@ gtk_tree_view_drag_data_received (GtkWidget *widget, /* drop dest_row */ set_dest_row (context, NULL, NULL); } + + +/* GtkTreeViewColumnReorder functions + */ + +static GtkTreeViewColumnReorder * +gtk_tree_view_column_reorder_new (void) +{ + return g_new (GtkTreeViewColumnReorder, 1); +} + +static void +gtk_tree_view_column_reorder_free (GtkTreeViewColumnReorder *reorder) +{ + g_free (reorder); +} + +static void +gtk_tree_view_column_reorder_begin_draw (GtkTreeViewColumnReorder *reorder) +{ + if (reorder == NULL) + return; + + if (reorder->right_column) + { + gtk_widget_queue_draw (reorder->right_column->button); + g_signal_handlers_disconnect_matched (G_OBJECT (reorder->right_column->button), + G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, + gtk_tree_view_column_button_expose, + NULL); + } + if (reorder->left_column) + { + gtk_widget_queue_draw (reorder->left_column->button); + g_signal_handlers_disconnect_matched (G_OBJECT (reorder->left_column->button), + G_SIGNAL_MATCH_FUNC, + 0, 0, NULL, + gtk_tree_view_column_button_expose, + NULL); + } +} + +static void +gtk_tree_view_column_reorder_remove_draw (GtkTreeViewColumnReorder *reorder) +{ + if (reorder->left_column) + { + gtk_signal_connect_after (GTK_OBJECT (reorder->left_column->button), + "expose_event", + (GtkSignalFunc) gtk_tree_view_column_button_expose, + GINT_TO_POINTER (TRUE)); + gtk_widget_queue_draw (reorder->left_column->button); + } + if (reorder->right_column) + { + gtk_signal_connect_after (GTK_OBJECT (reorder->right_column->button), + "expose_event", + (GtkSignalFunc) gtk_tree_view_column_button_expose, + GINT_TO_POINTER (FALSE)); + gtk_widget_queue_draw (reorder->right_column->button); + } +} + diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h index 640128c5c4..61e234321a 100644 --- a/gtk/gtktreeview.h +++ b/gtk/gtktreeview.h @@ -65,18 +65,18 @@ struct _GtkTreeViewClass { GtkContainerClass parent_class; - void (* set_scroll_adjustments) (GtkTreeView *tree_view, - GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); - void (* row_activated) (GtkTreeView *tree_view, - GtkTreeViewColumn *column); - gint (* expand_row) (GtkTreeView *tree_view, - GtkTreeIter *iter, - GtkTreePath *path); - gint (* collapse_row) (GtkTreeView *tree_view, - GtkTreeIter *iter, - GtkTreePath *path); - + void (* set_scroll_adjustments) (GtkTreeView *tree_view, + GtkAdjustment *hadjustment, + GtkAdjustment *vadjustment); + void (* row_activated) (GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column); + gboolean (* expand_row) (GtkTreeView *tree_view, + GtkTreeIter *iter, + GtkTreePath *path); + gboolean (* collapse_row) (GtkTreeView *tree_view, + GtkTreeIter *iter, + GtkTreePath *path); }; @@ -172,7 +172,7 @@ gboolean gtk_tree_view_collapse_row (GtkTreeView void gtk_tree_view_row_activated (GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column); -void gtk_tree_view_map_open_rows (GtkTreeView *tree_view, +void gtk_tree_view_map_expanded_rows (GtkTreeView *tree_view, GtkTreeViewMappingFunc func, gpointer data); -- 2.30.2